#include "vectorList.h"
//#include "Element.h"


//--------------------------------------------------------------------------------------------
void vectorListCreate(vectorList * l)
{
	l->first = NULL;
	 l->last = NULL;
}             
//--------------------------------------------------------------------------------------------
void vectorListAddItem(vectorList * l, void * item, int sizeItem)
{
	
	nList * nAux = (nList*) malloc(sizeof(nList));
	if (l->first == NULL) // lista vacia
	{
		nAux->item = malloc (sizeItem);          // reservo memoria para el nuevo item
		memcpy(nAux->item, item, sizeItem);      // copio el contenido del elemento 
		l->first = nAux;                         // lo guardo en el primero
	    l->first->next = NULL;
		l->first->sizeItem = sizeItem;
		l->last = l->first;
	}
	else //lista no vacia agrego al final
	{
	   nAux->item = malloc (sizeItem);                // reservo memoria para el nuevo item
	   memcpy(nAux->item, item, sizeItem);            // copio el contenido del elemento 
	   nAux->sizeItem = sizeItem;
	   l->last->next = nAux;                            // lo guardo en el ultimo
	   l->last = l->last->next;
	   l->last->next = NULL;
	}

}
//--------------------------------------------------------------------------------------------
void vectorListAddItemIn(vectorList * l, void * item, int sizeItem,int index)
{
	
	nList * nAux = (nList*) malloc(sizeof(nList));
	nList * nPrev=NULL;
	nList * nCurr = l->first;
	nList * nTmp;
	int i=0;
	for ( i = 0; i < index; i++){ 
		if (nCurr != l->last) {  
			 nPrev = nCurr;                  // guardo el anterior
			 nCurr = nCurr->next;			 
		  }
	 }



    nAux->item = malloc (sizeItem);                // reservo memoria para el nuevo item
    memcpy(nAux->item, item, sizeItem);            // copio el contenido del elemento 
    nAux->sizeItem = sizeItem;
    
	nTmp = nCurr->next;

	if (nPrev)
		nPrev->next = nAux;
	else{
		l->first = nAux;
	}
	nAux->next = nTmp;
	

}	
//--------------------------------------------------------------------------------------------
int vectorListGetItem(vectorList l,int index, void * item)
{
	int i;
	nList * nCurr = l.first;
	if (nCurr == NULL) { return -1;}            // lista Vacia
	else 
	{
	  for ( i = 0; i < index; i++){  
		  if (nCurr->next) {
			  nCurr = nCurr->next;
		  } else {
			  return -1;
		  }
	  }

	  memcpy(item, nCurr->item,nCurr->sizeItem);	  
	  return 0;
	}

}
//--------------------------------------------------------------------------------------------
int vectorListRemoveItem(vectorList * l, int index)
{
	int i;
	nList * nPrev;
	nList * nCurr = l->first;
	if (nCurr == NULL) { return -1;}            // lista Vacia
	else
	{
		if (index == 0)
		{
	       if (l->first->next) {l->first = l->first->next;}
		   free(nCurr->item);
		   free(nCurr);
		   return 0;
		} 
		else 
		  for ( i = 0; i < index; i++)
		  { if (nCurr != l->last) 
			  {  nPrev = nCurr;                  // guardo el anterior
				 nCurr = nCurr->next;			 
			  }
		  }
		  
        if ( nCurr == l->last) {l->last = nPrev;}
		else { nPrev->next = nCurr->next;}
	  
	  free(nCurr->item);
	  free(nCurr);
	  return 0;
	}

}
//--------------------------------------------------------------------------------------------
void vectorListFree(vectorList * l)
{   nList * nAux, *nCurr;
    nCurr = l->first;
	while (nCurr != l->last) 
	{
	  nAux  = nCurr;
	  nCurr = nCurr->next;
	  free(nAux->item);
	  free(nAux);
	 	
	};
	l->first = l->last = NULL;
}
//--------------------------------------------------------------------------------------------
int vectorListEmpty(vectorList * l)
{
	if (!l->first) {return 1;}
	return 0;
}
//--------------------------------------------------------------------------------------------
/*
int vectorListGetSize(vectorList *l){
	Element auxElem1;
	int i=0;
	while(vectorListGetItem(*l,i,&auxElem1) != -1){
		i++;
	}
	return i;
}
*/

/*  Version Martin Por Favor Testeenla ustedes que conocen el Parser */
/*  Funcion que retorna la cantidad de elementos de la lista         */
int vectorListGetSize(vectorList *l){
	
	int i;
    nList * nCurr = l->first;
	i = 0;
	while (nCurr != l->last) 
	{
		nCurr = nCurr->next;
	  	i++;
	}
	return i;
}




